/**
 * @author HuWen
 * @date 2025/8/7 17:36)
 *
 *     - **并发编程**：掌握CAS机制、ReentrantLock源码、线程池原理（ThreadPoolExecutor七大参数），完成生产者-消费者模型实战
 * */

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS（Compare And Swap）机制示例
 * 基于AtomicInteger展示无锁的原子操作
 */
import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {
    // 原子整数，用于演示CAS操作的原子性
    private static final AtomicInteger atomicInt = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        // 创建10个线程
        Thread[] threads = new Thread[10];

        for (int i = 0; i < 10; i++) {
            // 每个线程执行1000次自增操作
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    // 调用AtomicInteger的自增方法（内部基于CAS实现）
                    atomicInt.incrementAndGet();
                    // 手动模拟CAS操作过程
                    manualCASDemo();
                }
            });
            threads[i].start(); // 启动线程
        }

        // 使用正确的foreach语法等待所有线程执行完毕
        for (Thread thread : threads) {
            thread.join();
        }

        // 输出最终结果（预期为20000，因为每个自增操作执行了两次）
        System.out.println("最终结果: " + atomicInt.get());
    }

    /**
     * 手动模拟CAS操作的自旋过程
     */
    private static void manualCASDemo() {
        while (true) {
            int expectedValue = atomicInt.get();
            int targetValue = expectedValue + 1;
            boolean success = atomicInt.compareAndSet(expectedValue, targetValue);
            if (success) {
                break;
            }
        }
    }
}